package com.util;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

/**
 * 日期相关处理小工具
 * 
 * @author wujiwen
 * @date 2017-07-25
 */
public class DateUtils {
	
	/**
     * 获取当前当前时间前一天的日期
     * @return
     */
    public static String getYestoday(){
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.DATE, -1);
        return new SimpleDateFormat("yyyyMMdd").format(calendar.getTime());
    }
    
    
    /**
     * 根据 num 得到当前年份前后num年  可用于年份下拉框
     * @param num 前后num年 
     * @return List<HashMap<String,String>> 包含键值对的年份list
     */
    public static List<HashMap<String,String>> getYearList(int num){
    	SimpleDateFormat dateFormat = new  SimpleDateFormat("yyyy");
    	int year = Integer.parseInt(dateFormat.format(new Date()));
    	List<HashMap<String,String>> rsList = new ArrayList<HashMap<String,String>>();
    	for (int i = year - num; i <= year + num; i++) {
			HashMap<String,String> map = new HashMap<String,String>();
			map.put("year", String.valueOf(i));
			rsList.add(map);
    	}
    	return rsList;
    	
    }
   
    public String formatStr(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String str = sdf.format(date);
        StringBuffer sb = new StringBuffer();
        int pos1 = str.indexOf("-");
        int pos2 = str.lastIndexOf("-");
        for (int i = 0; i < 4; i++) {
            sb.append(formatDigit(str.charAt(i)));
        }
        sb.append('年');
        if (getMidLen(str, pos1, pos2) == 1) {
            sb.append(formatDigit(str.charAt(5)) + "月");
            if (str.charAt(7) != '0') {
                if (getLastLen(str, pos2) == 1) {
                    sb.append(formatDigit(str.charAt(7)) + "日");
                }
                if (getLastLen(str, pos2) == 2) {
                    if (str.charAt(7) != '1' && str.charAt(8) != '0') {
                        sb.append(formatDigit(str.charAt(7)) + "十"
                                + formatDigit(str.charAt(8)) + "日");
                    } else if (str.charAt(7) != '1' && str.charAt(8) == '0') {
                        sb.append(formatDigit(str.charAt(7)) + "十日");
                    } else if (str.charAt(7) == '1' && str.charAt(8) != '0') {
                        sb.append("十" + formatDigit(str.charAt(8)) + "日");
                    } else {
                        sb.append("十日");
                    }
                }
            } else {
                sb.append(formatDigit(str.charAt(8)) + "日");
            }
        }
        if (getMidLen(str, pos1, pos2) == 2) {
            if (str.charAt(5) != '0' && str.charAt(6) != '0') {
                sb.append("十" + formatDigit(str.charAt(6)) + "月");
                if (getLastLen(str, pos2) == 1) {
                    sb.append(formatDigit(str.charAt(8)) + "日");
                }
                if (getLastLen(str, pos2) == 2) {
                    if (str.charAt(8) != '0') {
                        if (str.charAt(8) != '1' && str.charAt(9) != '0') {
                            sb.append(formatDigit(str.charAt(8)) + "十"
                                    + formatDigit(str.charAt(9)) + "日");
                        } else if (str.charAt(8) != '1' && str.charAt(9) == '0') {
                            sb.append(formatDigit(str.charAt(8)) + "十日");
                        } else if (str.charAt(8) == '1' && str.charAt(9) != '0') {
                            sb.append("十" + formatDigit(str.charAt(9)) + "日");
                        } else {
                            sb.append("十日");
                        }
                    } else {
                        sb.append(formatDigit(str.charAt(9)) + "日");
                    }
                }
            } else if (str.charAt(5) != '0' && str.charAt(6) == '0') {
                sb.append("十月");
                if (getLastLen(str, pos2) == 1) {
                    sb.append(formatDigit(str.charAt(8)) + "日");
                }
                if (getLastLen(str, pos2) == 2) {
                    if (str.charAt(8) != '0') {
                        if (str.charAt(8) != '1' && str.charAt(9) != '0') {
                            sb.append(formatDigit(str.charAt(8)) + "十"
                                    + formatDigit(str.charAt(9)) + "日");
                        } else if (str.charAt(8) != '1' && str.charAt(9) == '0') {
                            sb.append(formatDigit(str.charAt(8)) + "十日");
                        } else if (str.charAt(8) == '1' && str.charAt(9) != '0') {
                            sb.append("十" + formatDigit(str.charAt(9)) + "日");
                        } else {
                            sb.append("十日");
                        }
                    } else {
                        sb.append(formatDigit(str.charAt(9)) + "日");
                    }
                }
            } else {
                sb.append(formatDigit(str.charAt(6)) + "月");
                if (getLastLen(str, pos2) == 1) {
                    sb.append(formatDigit(str.charAt(8)) + "日");
                }
                if (getLastLen(str, pos2) == 2) {
                    if (str.charAt(8) != '0') {
                        if (str.charAt(8) != '1' && str.charAt(9) != '0') {
                            sb.append(formatDigit(str.charAt(8)) + "十"
                                    + formatDigit(str.charAt(9)) + "日");
                        } else if (str.charAt(8) != '1' && str.charAt(9) == '0') {
                            sb.append(formatDigit(str.charAt(8)) + "十日");
                        } else if (str.charAt(8) == '1' && str.charAt(9) != '0') {
                            sb.append("十" + formatDigit(str.charAt(9)) + "日");
                        } else {
                            sb.append("十日");
                        }
                    } else {
                        sb.append(formatDigit(str.charAt(9)) + "日");
                    }
                }
            }
        }
        return sb.toString();
    }
    /**
     * create date:2010-5-22下午03:40:47 描述：取出日期字符串中的月份字符串
     * 
     * @param str日期字符串
     * @return
     */
    public String getMonthStr(String str) {
        // String m;
        int startIndex = str.indexOf("年");
        int endIndex = str.indexOf("月");
        String monthStr = str.substring(startIndex + 1, endIndex);
        return monthStr;
    }

    /**
     * create date:2010-5-22下午03:32:31 描述：将源字符串中的阿拉伯数字格式化为汉字
     * 
     * @param sign
     *            源字符串中的字符
     * @return
     */
    public char formatDigit(char sign) {
        if (sign == '0')
            sign = '零';
        if (sign == '1')
            sign = '一';
        if (sign == '2')
            sign = '二';
        if (sign == '3')
            sign = '三';
        if (sign == '4')
            sign = '四';
        if (sign == '5')
            sign = '五';
        if (sign == '6')
            sign = '六';
        if (sign == '7')
            sign = '七';
        if (sign == '8')
            sign = '八';
        if (sign == '9')
            sign = '九';
        return sign;
    }

    /**
     * create date:2010-5-22下午03:31:51 描述： 获得月份字符串的长度
     * 
     * @param str
     *            待转换的源字符串
     * @param pos1
     *            第一个'-'的位置
     * @param pos2
     *            第二个'-'的位置
     * @return
     */
    public int getMidLen(String str, int pos1, int pos2) {
        return str.substring(pos1 + 1, pos2).length();
    }

    /**
     * create date:2010-5-22下午03:32:17 描述：获得日期字符串的长度
     * 
     * @param str
     *            待转换的源字符串
     * @param pos2
     *            第二个'-'的位置
     * @return
     */
    public int getLastLen(String str, int pos2) {
        return str.substring(pos2 + 1).length();
    }

    /**
     * create date:2010-5-22下午03:40:50 描述：取出日期字符串中的日字符串
     * 
     * @param str
     *            日期字符串
     * @return
     */
    public String getDayStr(String str) {
        String dayStr = "";
        int startIndex = str.indexOf("月");
        int endIndex = str.indexOf("日");
        dayStr = str.substring(startIndex + 1, endIndex);
        return dayStr;
    }
    /**
     * 日期转换器，接受不同格式的日期字符串，转换成日期对象
     * @return
     * @throws Exception 
     */
    public static Date dateConverter(String dateStr) throws Exception {
        //定义可能会出现的字符串格式的日期类型
        final DateFormat[] dfs = {
                new SimpleDateFormat("yyyy-MM-dd"),
                new SimpleDateFormat("yyyyMMdd"),
                new SimpleDateFormat("yyyy/MM/dd"),
                new SimpleDateFormat("yyyy年MM月dd日"),
        };
        //一次循环，如匹配不上继续，直到结束
        for (int i = 0; i < dfs.length; i++) {
            try {
                return dfs[i].parse(dateStr);
            } catch (ParseException e) {
               continue;
            }
        }
        throw new Exception();
    }
    
    public static void main(String[] args) throws Exception {
        System.out.println(dateConverter("2017/3/1"));
    }
    
    
}
